package com.badlogic.androidgames.framework.gl;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.microedition.khronos.opengles.GL10;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;

import com.badlogic.androidgames.framework.FileIO;
import com.badlogic.androidgames.framework.impl.GLGame;
import com.badlogic.androidgames.framework.impl.GLGraphics;

import com.badlogic.androidgames.asyncutil.AsyncBitmapLoader;

public class Texture {
	GLGame glGame;
    GLGraphics glGraphics;
    FileIO fileIO;
    String fileName;
    URL url;
    int textureId;
    int minFilter;
    int magFilter;   
    public int width;
    public int height;
    
    public Texture(GLGame glGame, String fileName) {
    	this.glGame = glGame;
        this.glGraphics = glGame.getGLGraphics();
        this.fileIO = glGame.getFileIO();
        this.fileName = fileName;
        this.url = null;
        load();
    }
    
    public Texture(GLGame glGame, URL url) {
    	this.glGame = glGame;
        this.glGraphics = glGame.getGLGraphics();
        this.fileIO = glGame.getFileIO();
        this.url = url;
        this.fileName = null;
        load();
    }
    
    private void load() {
        GL10 gl = glGraphics.getGL();
        int[] textureIds = new int[1];
        gl.glGenTextures(1, textureIds, 0);
        textureId = textureIds[0];
        
        if(fileName != null)
        {
	        InputStream in = null;
	        try {
	            in = fileIO.readAsset(fileName);
	            Bitmap bitmap = BitmapFactory.decodeStream(in);
	            gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
	            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
	            setFilters(GL10.GL_NEAREST, GL10.GL_NEAREST);
	            gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
	            width = bitmap.getWidth();
	            height = bitmap.getHeight();
	            bitmap.recycle();
	        } catch(IOException e) {
	            throw new RuntimeException("Couldn't load texture '" + fileName +"'", e);
	        } finally {
	            if(in != null)
	                try { in.close(); } catch (IOException e) { }
	        }
    	}
        else
        {
            try {
        		AsyncBitmapLoader v = (AsyncBitmapLoader) new AsyncBitmapLoader(glGame).execute(url);
                //Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        		Bitmap bitmap= null;
				
				bitmap = v.get();
				
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
                setFilters(GL10.GL_NEAREST, GL10.GL_NEAREST);            
                gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
                width = bitmap.getWidth();
                height = bitmap.getHeight();
                bitmap.recycle();
            } catch(Exception e) {
                throw new RuntimeException("Couldn't load texture '" + fileName +"'", e);
            } 
        }
    }
    
    public void reload() {
        load();
        bind();
        setFilters(minFilter, magFilter);        
        glGraphics.getGL().glBindTexture(GL10.GL_TEXTURE_2D, 0);
    }
    
    public void setFilters(int minFilter, int magFilter) {
        this.minFilter = minFilter;
        this.magFilter = magFilter;
        GL10 gl = glGraphics.getGL();
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, minFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, magFilter);
    }    
    
    public void bind() {
        GL10 gl = glGraphics.getGL();
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
    }
    
    public void dispose() {
        GL10 gl = glGraphics.getGL();
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
        int[] textureIds = { textureId };
        gl.glDeleteTextures(1, textureIds, 0);
    }
}